home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / KEYWITCH / KW_S200.LZH / w10head.s < prev    next >
Text File  |  1995-03-20  |  8KB  |  372 lines

  1.     .include    w02iocs.mac
  2.     .include    w03const.mac
  3.     .include    w04macro.mac
  4.     .include    w05reloc.mac
  5.     .include    w08id.mac
  6.  
  7.     .text
  8.     .even
  9.  
  10. ********************************
  11. *相対アドレッシングのためのベースアドレス
  12. base::    equ    prog_head+$7F00        *ワークエリアの最後まで届くようにずらす
  13.  
  14. ********************************
  15. *プログラムはじめ
  16. prog_head::
  17. *デバイスヘッダ
  18.     .dc.l    -1
  19.     .dc.w    $8000
  20.     .dc.l    device_strategy
  21.     .dc.l    device_interrupt
  22. device_name::
  23.     .dc.b    '"Witch?"'
  24.  
  25. device_request::
  26.     .ds.l    1
  27.  
  28. device_strategy::
  29.     move.l    a5,device_request
  30.     rts
  31.  
  32. device_interrupt::
  33.     move.l    a5,-(sp)
  34.     move.l    d0,-(sp)
  35.     move.w    #$5003,d0
  36.     movea.l    device_request(pc),a5
  37.     tst.b    2(a5)
  38.     bne    device_error        *初期化以外のデバイスコマンドは無効
  39.     bsr    device_main        *メインルーチンを呼ぶ
  40. device_error::
  41.     move.b    d0,3(a5)
  42.     ror.w    #8,d0
  43.     move.b    d0,4(a5)
  44.     move.l    (sp)+,d0
  45.     movea.l    (sp)+,a5
  46.     rts
  47.  
  48. ********************************
  49. *デバイスドライバの末尾のアドレス
  50. device_end::
  51.     .dc.l    0
  52.  
  53. ********************************
  54. *データ部を別にアロケートした場合のアドレス
  55. alloc_point::
  56.     .dc.l    0
  57.  
  58. ********************************
  59. *ベクタ管理テーブル
  60. vector_table::
  61. *キー入力エラー割り込み
  62.     .dc.w    KEYERR*4
  63.     .ds.l    1
  64.     .dc.l    key_err
  65. *キー入力割り込み
  66.     .dc.w    KEYINT*4
  67.     .ds.l    1
  68.     .dc.l    key_int
  69. *B_KEYINP
  70.     .dc.w    $0400+_B_KEYINP*4
  71. old_b_keyinp::
  72.     .ds.l    1
  73.     .dc.l    _b_keyinp
  74. *B_KEYSNS
  75.     .dc.w    $0400+_B_KEYSNS*4
  76. old_b_keysns::
  77.     .ds.l    1
  78.     .dc.l    _b_keysns
  79. *KEY_INIT
  80.     .dc.w    $0400+_KEY_INIT*4
  81.     .ds.l    1
  82.     .dc.l    _key_init
  83. *SKEYSET
  84.     .dc.w    $0400+_SKEYSET*4
  85.     .ds.l    1
  86.     .dc.l    _skeyset
  87. *LEDCTRL
  88.     .dc.w    $0400+_LEDCTRL*4
  89.     .ds.l    1
  90.     .dc.l    _ledctrl
  91. *LEDSET
  92.     .dc.w    $0400+_LEDSET*4
  93.     .ds.l    1
  94.     .dc.l    _ledset
  95. *KEYDLY
  96.     .dc.w    $0400+_KEYDLY*4
  97.     .ds.l    1
  98.     .dc.l    _keydly
  99. *KEYREP
  100.     .dc.w    $0400+_KEYREP*4
  101.     .ds.l    1
  102.     .dc.l    _keyrep
  103. *LEDMOD
  104.     .dc.w    $0400+_LEDMOD*4
  105.     .ds.l    1
  106.     .dc.l    _ledmod
  107. *JOYGET
  108.     .dc.w    $0400+_JOYGET*4
  109. old_joyget::
  110.     .ds.l    1
  111.     .dc.l    _joyget
  112. *ベクタ管理テーブル終わり
  113.     .dc.w    0
  114.  
  115. ********************************
  116. *走行中のプログラムのメモリ管理ポインタへのハンドル
  117. prog_hdl::
  118.     .dc.l    0
  119.  
  120. ********************************
  121. *現在アクティブなタスクのファイル名へのポインタ
  122. active_task::
  123.     .dc.l    0
  124.  
  125. ********************************
  126. *Interrupt発生時のためのsspのワーク
  127. interrupt_ssp::
  128.     .dc.l    0
  129.  
  130. ********************************
  131. *コード変換テーブルの先頭アドレス
  132. prefix_table::
  133.     .dc.l    default_prefix_table    *&prefix
  134. assign_table::
  135.     .dc.l    default_assign_table    *&assign
  136. suffix_table::
  137.     .dc.l    default_suffix_table    *&suffix
  138. char_table::
  139.     .dc.l    default_char_table    *文字コード
  140. meta_table::
  141.     .dc.l    default_meta_table    *メタキー
  142. prog_table::
  143.     .dc.l    default_prog_table    *プログラム
  144.  
  145. ********************************
  146. *イベントを発生するキーのテーブルのアドレス
  147. break_table::
  148.     .dc.l    default_break_table    *BREAK
  149. copy_table::
  150.     .dc.l    default_copy_table    *コピー
  151. den_table::
  152.     .dc.l    default_den_table    *電卓
  153. int_table::
  154.     .dc.l    default_int_table    *Interrupt
  155. reset_table::
  156.     .dc.l    default_reset_table    *リセット
  157. sbreak_table::
  158.     .dc.l    default_sbreak_table    *SHIFT+BREAK
  159.  
  160. lock_table::
  161.     .dc.l    default_lock_table    *禁止
  162. unlock_table::
  163.     .dc.l    default_unlock_table    *解除
  164.  
  165. ********************************
  166. *イベントを発生するキーに対するプロシージャ
  167. break_proc::
  168.     .dc.l    default_break_proc
  169. copy_proc::
  170.     .dc.l    default_copy_proc
  171. den_proc::
  172.     .dc.l    default_den_proc
  173. int_proc::
  174.     .dc.l    default_int_proc
  175. reset_proc::
  176.     .dc.l    default_reset_proc
  177. sbreak_proc::
  178.     .dc.l    default_sbreak_proc
  179.  
  180. ********************************
  181. *_SKEYSETプロシージャ
  182. skeyset_proc::
  183.     .dc.l    skeyset_main
  184.  
  185. ********************************
  186. *拡張バッファ関係のワーク
  187. extend_size::
  188.     .dc.w    0            *拡張バッファのサイズ(ワード数)
  189. extend_head::
  190.     .dc.l    0            *拡張バッファの先頭
  191. extend_tail::
  192.     .dc.l    0            *拡張バッファの末尾
  193. extend_used::
  194.     .dc.w    0            *データ数(ワード数)
  195. extend_read::
  196.     .dc.l    0            *先頭のデータの位置
  197. extend_last::
  198.     .dc.l    0            *最後のデータの位置
  199.  
  200. ********************************
  201. *キーの押し下げ状態マトリクスとキューのワーク
  202. *  このマトリクスは誤入力の判定に使うので、遅延の影響を受けません。
  203. matrix_bits::
  204.     .dcb.b    16,0            *キーの押し下げ状態マトリクス
  205. queue_head::
  206.     .dc.w    0            *キューの先頭位置
  207. queue_count::
  208.     .dc.w    0            *キューのデータ数
  209. queue_top::
  210.     .dcb.b    Q_SIZE,0        *キュー領域
  211.  
  212. ********************************
  213. *ルールの判定に使うBITSNSマップ($0800~$080Fに対応)
  214. inner_map::
  215.     .dcb.b    16,0
  216.  
  217. ********************************
  218. *キー入力禁止状態で使うBITSNSマップ($0800~$0811に対応)
  219. lock_map::
  220.     .dcb.b    18,0            *BITSNSマップ
  221.  
  222. ********************************
  223. *リピート関係の設定($0800~$080Fに対応)
  224. repeat_bits::
  225.     .dcb.b    16,0            *リピート入力しないキー
  226. live_repeat_bits::
  227.     .dcb.b    14,0            *リピート入力しないキーの初期値
  228.     .dc.b    %00001111
  229.     .dcb.b    1,0
  230. kill_repeat_bits::
  231.     .dcb.b    14,0            *離したとき他のリピート入力を止めるキー
  232.     .dc.b    %00001111
  233.     .dcb.b    1,0
  234.  
  235. ********************************
  236. *ASK68Kの変更のためのワーク
  237. *  &askのデフォルトはauto(5),ins(7),led(6),lock(1),tsu(2)
  238. ask_flag_bits::
  239. *         BA98_76543210
  240.     .dc.l    %0000_11100110        *変更する項目のビット=1
  241. ask_mode_area::
  242.     .dc.l    0            *ASK68KのSHIFTなどのフラグのアドレス
  243.  
  244. ********************************
  245. *オプションで指定するフラグ
  246. ask_flag::
  247.     .dc.b    0            *ASK68Kを変更する=-1
  248. extend_flag::
  249.     .dc.b    0            *キーバッファを拡張する=-1
  250. click_flag::
  251.     .dc.b    0            *クリック音を鳴らす=-1
  252. delay_flag::
  253.     .dc.b    0            *誤入力を回避する=-1
  254. full_flag::
  255.     .dc.b    0            *バッファフルを知らせる=-1
  256. lock_flag::
  257.     .dc.b    0            *キー入力禁止モードを使用する=-1
  258. joykey_flag::
  259.     .dc.b    0            *キーでジョイスティックの操作をする=-1
  260. led_flag::
  261.     .dc.b    0            *LEDを入れ替える=-1
  262. meta_flag::
  263.     .dc.b    0            *メタキーを使う=-1
  264. repeat_flag::
  265.     .dc.b    0            *押されたキーのリピートを抑制する=-1
  266. prog_flag::
  267.     .dc.b    0            *プログラム毎に異なるキー配置を使う=-1
  268. stop_flag::
  269.     .dc.b    0            *離されたとき他のリピートを止める=-1
  270. tvkey_flag::
  271.     .dc.b    0            *テレビコントロールのキー入力を有効にする=-1
  272. exchange_flag::
  273.     .dc.b    0            *スキャンコードを変換する=-1
  274.  
  275. ********************************
  276. *その他のフラグ類
  277. device_flag::
  278.     .dc.b    0            *デバイスドライバとして組み込まれた=-1
  279. compact_flag::
  280.     .dc.b    0            *Compactのキーボードを使用している=-1
  281. num_led::
  282.     .dc.b    0            *NUMキーのLEDが点灯している=-1
  283. lock_mode::
  284.     .dc.b    0            *キー入力が禁止されている=-1
  285. int_mode::
  286.     .dc.b    0            *&intの利用を禁止する=-1
  287.  
  288. ********************************
  289. *LEDの入れ替えマップ(対応するビット=0)
  290. led_map::
  291.     .dc.b    %11111110
  292.     .dc.b    %11111101
  293.     .dc.b    %11111011
  294.     .dc.b    %11110111
  295.     .dc.b    %11101111
  296.     .dc.b    %11011111
  297.     .dc.b    %10111111
  298.  
  299. ********************************
  300. *ジョイスティックのキーの割り当てマップ
  301. *  ビット昇順でスキャンコードを記述。対応なし=0。
  302. *  デフォルトはテンキーの8/2/4/6とZ/X。
  303. joy1_map::
  304.     .dc.b    $44,$4C,$47,$49,$00,$2A,$2B,$00
  305. joy2_map::
  306.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00
  307.  
  308.     .even
  309.  
  310. ********************************
  311. *キー入力エラー割り込みルーチン
  312. key_err::
  313.     tst.b    UDR            *キー入力データを捨てる
  314.     rte
  315.  
  316. ********************************
  317. *常駐チェックに使う文字列
  318. program_id::
  319.     .dc.l    PROMARK            *プログラム
  320.     .dc.l    VERMARK            *バージョン
  321.  
  322. ********************************
  323. *キー入力割り込み処理ルーチン
  324. key_int::
  325. *レジスタ待避
  326.     movem.l    d0-d7/a0-a4/a6,-(sp)
  327. *キーデータを取り込む
  328.     move.b    UDR,d1            *キー入力データ
  329. *相対アドレッシングのためのベースレジスタの設定
  330.     lea.l    base(pc),a6
  331. *キーボードの初期化ならば分岐
  332.     cmp.b    #$FE,d1
  333.     bcc    initkey            *キーボードの初期化
  334. *Interrupt発生時のためのsspを設定
  335.     lea.l    4*14(sp),a0        *プッシュしたレジスタの個数に注意
  336.     move.l    a0,(interrupt_ssp)r
  337. *キー入力割り込みを禁止する
  338.     bclr.b    #4,IMRA            *キー入力割り込みマスククリア
  339. *割り込みレベルを設定
  340.     move.w    (a0),d0            *割り込み前のsr
  341.     and.w    #$0700,d0        *割り込み前の割り込みレベル
  342.     move.w    sr,d2
  343.     and.w    #$F8FF,d2        *割り込みレベルだけ消す
  344.     or.w    d2,d0            *割り込みレベルだけ変更する
  345.     move.w    d0,sr
  346. *simulateメインを呼び出す
  347.     bsr    simulate_main        *simulateメイン
  348. *キー入力割り込みマスクを復元する
  349.     bset.b    #4,IMRA            *キー入力割り込みマスクセット
  350. key_int_end::
  351. *レジスタ復元
  352.     movem.l    (sp)+,d0-d7/a0-a4/a6
  353.     rte
  354.  
  355. *キーボードの初期化
  356. initkey::
  357.     beq    compact            *Compactの場合
  358. *キーボード関係を初期化する
  359.     move.b    LEDSNS.w,d1        *LEDの状態
  360.     bsr    _key_init        *キーボード関係の初期化
  361. *初期化終了
  362.     bra    key_int_end
  363.  
  364. *Compactの場合
  365. compact::
  366.     st.b    (compact_flag)r        *フラグをセット
  367. *NUMキーのLEDを初期化する
  368. *    clr.b    (num_led)r
  369.     bsr    _numset            *現在のモードに従ってNUMキーのLEDを設定
  370. *初期化終了
  371.     bra    key_int_end
  372.